1. 安全
Linux的安全,对于运维人员来说是重中之重,掌握基本的安全知识是非常有必要的。这一节学习笔记就是来宏观地记录在Linux下的安全知识。
1.1. Linux发行版本
在选择Linux发行版的时候,一定要选择主流的、更新较快的发行版。比如Redhat、CentOS、Ubuntu等,这些发行版用户群体是很庞大的,而且它们的发行厂商也是非常有实力的,有很多高级安全工程师来维护这些发行版的安全。
我们安装的时候要获得镜像,一定要从官网获取。
1.2. 硬件和物理安全
在这个方面,要注意以下的问题:
- 设置BIOS密码:为了防止别人可以拿安装盘重装系统,或者进入救援模式
- 设置Grub密码:为了防止进入单用户模式
- 设置系统密码:系统密码在我们安装系统的时候是必须要设置的,只不过这个密码也许你设置的很简单,很容易被暴力破解,所以密码要设置复杂一些
- 选择有安全保障的IDC机房,机房首选得保证不能随便让陌生人进入,其次机房的配套设施得完善,制冷设备必须一年四季都好使,电压要稳定,要配有UPS电池,可以供给短暂电源,机房不能出现漏水、漏电等事故
- 最后,现在云计算已经成为一种必然的趋势,云计算可以为我们节约了很多基础性安全的成本
1.3. 系统和用户方面
在这个方面,要注意以下的问题:
- 关闭用不到的服务
- 尽量升级到最新的稳定版本程序包
- 合理设置防火墙规则
- 不需要登陆的用户要禁止登陆
- root远程登陆限制(比如:禁止远程root登陆,用户必须用密钥的方式登陆等等)
- 一定要打开系统日志记录一切信息,比如/var/log/messages、/var/log/secure。如果是Web服务,一定要打开访问日志
- 配置合适的sudoer
1.4. 文件系统安全
在这个方面,要注意以下的问题:
- 使用ext3、ext4或xfs系统,因为它们有日志功能
- 严格控制目录和文件的权限umask,避免权限放大,对于不应该有权限的用户,绝不给它多余的权限
- 尽量少使用suid/sgid权限
- 重要的数据或配置文件要指定备份计划
1.5. pam
它的主要配置文件在/etc/pam.conf和/etc/pam.d/。
pam的类型:
- auth:用户验证相关,要求用户输入一个口令
- account:用户账户管理相关,检查一个用户的账户或者口令是否过期
- session:与连接或者会话管理相关,比如将用户登陆会话信息记录到日志
- password:密码管理
pam级别
- required:表示改行以及所涉及模块的成功是用户通过鉴别的必要条件。换句话说,只有当对应于应用程序的所有带required标记的模块全部成功后,该程序才能通过鉴别。同时,如果任何带required标记的模块出现了错误,PAM并不立刻将错误消息返回给应用程序,而是在所有模块都调用完毕后才将错误消息返回调用它的程序。反正说白了,就是必须将所有的模块都执行一次,其中任何一个模块验证出错,验证都会继续进行,并在执行完成之后才返回错误信息。这样做的目的就是不让用户知道自己被哪个模块拒绝,通过一种隐蔽的方式来保护系统服务。就像设置防火墙规则的时候将拒绝类的规则都设置为drop一样,以至于用户在访问网络不成功的时候无法准确判断到底是被拒绝还是目标网络不可达。
- requisite:与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别。不同之处在于其一旦失败就不再执行堆中后面的其它模块,并且鉴别过程到此结束,同时也会立即返回错误信息。与上面的required相比,似乎要显得更正大光明一些。
- sufficient:表示该行以及所涉及模块验证成功是用户通过鉴别的充分条件。也就是说,只要标记为sufficient的模块一旦验证成功,那么PAM便立即向应用程序返回成功结果而不必尝试任何其它模块。
- optional:它表示即便该行所涉及的模块验证失败用户仍能通过认证。
1.6. 应用安全
各种常用服务FTP、Samba、NFS、Rsync、MySQL、http等,都会有相关的配置,包含了用户登陆、权限控制相关的操作。不要小看这些服务,如果权限控制不好,很有可能导致到服务器被黑。
下面是Apache和Nginx的一些访问控制的示例:
- Apache配置:
- Apache的Order allow deny
- Apache限制某个目录下的PHP文件没有执行权限
- Apache针对访问URL限制IP
- Nginx配置:
- 限制只让某个IP访问
- 禁止通过IP访问站点
- 禁止某个IP或者IP段访问站点
- 使用user_agent控制客户端访问
1.7. Web安全
对于Web安全,要详细关注一些漏洞:文件上传、XSS、SQL注入、CSRF、访问控制等等
- 文件上传
- 就像Discuz论坛的图片上传,如果图片上传服务器时的日志可以执行PHP脚本,那么这就意味着,用户可以上传木马脚本,然后可以执行。所以,只要是能上传的目录,我们一定要做一个访问控制,甚至有必要禁止解析PHP。
- XSS
- 跨站脚本漏洞(Cross Site Scripting,常简写为CSS)是Web应用程序在将数据输出到网页的时候存在问题,导致攻击者可以将构造的恶意数据显示在页面的漏洞。因为跨站脚本攻击都是向网页内容中写入一段恶意的脚本或者HTML代码,故跨站脚本漏洞也被叫做HTML注入漏洞(HTMLInjection)。
- SQL注入
- 所谓的SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
- PHP+MySQL编程,引发SQL注入攻击的主要原因有两点:
- PHP配置文件php.ini中magic_quotes_pgc选项没有打开,被设置为off
- 开发者没有对数据类型进行检查和转义
- 上面两点中,第二点最为重要,如果没有第二点的保证,magic_quotes_pgc选项不论是on还是off,都可能引发SQL注入攻击。
- CSRF
- CSRF(Cross-site request forgery,跨站请求伪造)伪造用户的请求利用受信任的网站来做一些用户不知道的事情。
- 当用户访问网站通过登陆操作会得到身份标识的cookie,在不关闭浏览器并未注销登陆的情况下会带着cookie,这种状态下就有可能会让攻击者去伪造请求。
- 因为CSRF不容易被发现,所以用户通常不容易察觉但是其危害性是很明显的。
1.8. 入侵检测
主流的入侵检测工具为snort。可以学习一下。
2. 调优
2.1. 硬件方面
- CPU,使用主频高的CPU或者增加CPU核数都可以增加服务器的性能
- 内存,增加内容可以很有效地增加系统的性能
- 存储吗,也就是硬盘,大多时候系统性能的平瓶颈在与IO上,如果磁盘读写速度很快,那么整体性能会提升很多。另外我们 也可以把服务器上的硬盘做成Raid,以提升性能
- 网卡,网络速度跟不上也会导致系统性能下降,所以有必要使用千兆网卡,或者双网卡绑定,类似于磁盘的raid0
2.2. 系统方面
- 内核参数优化(网络相关、内存相关、缓冲缓存相关)
- 文件系统方面(分区调优、格式化时根据存储文件特性,指定合适的块大小,noatime,日志隔离,软raid,有效使用/dev/shm,关闭不必要的服务)
- CPU优化(进程绑定,中断绑定)
- numa架构CPU
- taskset把进程和CPU绑定
2.3. 应用程序方面
- Nginx、Apache、Php-fpm、MySQL、Tomcat、Squid等应用,是可以通过调节各个参数获得性能优化的。
- Web优化,比如可以把用户请求合并(js、css合并),使用CDN加速静态页访问速度,把图片文档压缩减少带宽传输
- 优化网站程序代码
2.4. 架构方面
- 使用简单并且稳定的架构方案
- 多使用缓存(Squid、Varnish、Memcache、NoSQL相关:redis、mongodb)